package cn.skyclass.business
{
	import mx.collections.ArrayCollection;
	import mx.controls.DataGrid;
	import mx.controls.dataGridClasses.DataGridColumn;
	
	/**
	 * 将 DataGrid 中的正在显示的内容全部提取出来
	 * @author fl
	 */	
	public class DataGridContentBuilder
	{
		/**
		 * 初始化一个 DataGridContentBuilder 实例
		 * 
		 * @param sourceGrid 需要从中获取内容的 DataGrid 实例，如果此值为 null，则必须提供随后的两个参数
		 * @param dataProvider 提供内容的数据列表，如果此值为 null，则使用 sourceGrid.dataProvider 的值
		 * @param columns 对内容进行处理的列信息，如果此值为 null，则使用 sourceGrid.columns 的值
		 */		
		public function DataGridContentBuilder(sourceGrid:DataGrid=null,
			dataProvider:ArrayCollection=null, columns:ArrayCollection=null)
		{
			this.sourceGrid = sourceGrid;
			this.dataProvider = dataProvider ? dataProvider : 
				this.sourceGrid.dataProvider as ArrayCollection;
			this.columns = columns ? columns : 
				new ArrayCollection(this.sourceGrid.columns);
		}
		
		
		public var columnSeparator:String = ",";
		public var rowSeparator:String = "\r\n";
		public var includeHeader:Boolean = true;

		protected var sourceGrid:DataGrid;
		protected var dataProvider:ArrayCollection;
		protected var columns:ArrayCollection;
		
		
		/**
		 * 生成的单元格二维数组，每个元素包含对应的单元格的文本数据内容
		 */
		protected var cellsArray:Array2D;
		
		
		public function getJoinedContent():String{
			return this.cellsArray.join(this.columnSeparator, this.rowSeparator);
		}
		
		public function getArrayContent():Array{
			return this.cellsArray.rowsData;
		}
		
		public function getCells():Array2D{
			return this.cellsArray;
		}
		
				
		/**
		 * 开始构建指定的 DataGrid 的内容
		 */
		public function build():void{
			this.init();
			
			var colCount:int = this.columns.length;
			var rowCount:int = this.dataProvider.length;
			
			// add header to array
			if(includeHeader){
				for(var i:int=0; i<colCount; i++){
					var c:DataGridColumn = this.columns.getItemAt(i) as DataGridColumn;
					this.cellsArray.setItem(i, 0, c.headerText);
				}
			}
			
			for(var j:int=0; j<rowCount; j++){
				var obj:Object = this.dataProvider.getItemAt(j);
				var rowIndex:int = includeHeader ? (j + 1) : j;
				for(var k:int=0; k<colCount; k++){
					var c1:DataGridColumn = this.columns.getItemAt(k) as DataGridColumn;
					this.cellsArray.setItem(k, rowIndex, c1.itemToLabel(obj));
				}
			}
		}
		
		/**
		 * 在进行内容构建之前进行相关成员变量的初始化
		 */		
		protected function init():void{
			var rowCount:int = this.dataProvider.length;
			this.cellsArray = new Array2D(this.columns.length, 
				includeHeader ? (rowCount + 1) : rowCount);			
		}
		
	}
}